home *** CD-ROM | disk | FTP | other *** search
/ Zoom 2 / Zoom - Release 2 (1996)(Active Software)[!].iso / graphics / icon_related / icontools-2.01 / icon2c.c < prev    next >
C/C++ Source or Header  |  1995-12-22  |  46KB  |  1,130 lines

  1. /*                                                               -*- C -*-
  2.  *  ICON2C.C
  3.  *
  4.  *  (c)Copyright 1994 by Tobias Ferber,  ukjg@rz.uni-karlsruhe.de
  5.  *
  6.  *  This file is part of the IconTools distribution
  7.  *
  8.  *  Icon2c is free software; you can redistribute it and/or modify
  9.  *  it under the terms of the GNU General Public License as published
  10.  *  by the Free Software Foundation; either version 1 of the License,
  11.  *  or (at your option) any later version.
  12.  *
  13.  *  Icon2c is distributed in the hope that it will be useful,
  14.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  *  GNU General Public License for more details.
  17.  *
  18.  *  You should have received a copy of the GNU General Public License
  19.  *  along with this program; see the file COPYING.  If not, write to
  20.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  */
  22.  
  23. #include "version.h"
  24. static char versiontag[]= "$VER: $Id: icon2c.c,v 1.7 1995/07/22 16:40:44 tf Exp $";
  25.  
  26. /* Compile w/ -DDEBUG to output more information at runtime */
  27.  
  28. #include <intuition/intuition.h>
  29. #include <intuition/intuitionbase.h>
  30.  
  31. #include <workbench/workbench.h>
  32. #include <workbench/icon.h>
  33.  
  34. #include <dos/dos.h>
  35. #include <dos/rdargs.h>
  36.  
  37. #include <stdarg.h>
  38. #include <stdlib.h>
  39. #include <string.h>
  40. #include <stdio.h>
  41.  
  42. #ifdef __GNUC__
  43. /* suggest parentheses around assignment used as truth value */
  44. #define if(assignment) if( (assignment) )
  45. #endif /* __GNUC__ */
  46.  
  47. extern struct Library *OpenLibrary(STRPTR, ULONG);
  48. extern void CloseLibrary(struct Library *);
  49. extern struct RDArgs *ReadArgs(STRPTR, LONG *, struct RDArgs *);
  50. extern LONG IoErr(void);
  51. extern BOOL PrintFault(LONG, STRPTR);
  52. extern void FreeArgs(struct RDArgs *);
  53. extern struct DiskObject *GetDiskObject(char *);
  54. extern void FreeDiskObject(struct DiskObject *);
  55.  
  56. struct IconBase *IconBase;
  57.  
  58. char *whoami, *iname;  /* argv[0], icon filename w/o ".info" */
  59. int quiet= 0;
  60. FILE *fout;
  61.  
  62.  
  63. void pout(const char *fmt, ...)
  64. {
  65.   va_list argp;
  66.   va_start(argp,fmt);
  67.   vfprintf(fout,fmt,argp);
  68.   va_end(argp);
  69. }
  70.  
  71.  
  72. void warn(const char *fmt, ...)
  73. {
  74.   if(!quiet)
  75.   {
  76.     va_list argp;
  77.     va_start(argp,fmt);
  78.     fprintf(stderr,"%s: %s.info: ",whoami, iname);
  79.     vfprintf(stderr,(char *)fmt,argp);
  80.     fprintf(stderr,"\n");
  81.     fflush(stderr);
  82.     va_end(argp);
  83.   }
  84. }
  85.  
  86.  
  87. void display_version_information(void)
  88. {
  89.   static char license[]=
  90.     "Icon2c is free software; you can redistribute it and/or modify\n"
  91.     "it under the terms of the GNU General Public License as published\n"
  92.     "by the Free Software Foundation; either version 1 of the License,\n"
  93.     "or (at your option) any later version.\n"
  94.     "\n"
  95.     "Icon2c is distributed in the hope that it will be useful,\n"
  96.     "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
  97.     "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
  98.     "GNU General Public License for more details.\n"
  99.     "\n"
  100.     "You should have received a copy of the GNU General Public License\n"
  101.     "along with Icon2C; see the file COPYING.  If not, write to the\n"
  102.     "Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n"
  103.     ;
  104.  
  105.   puts("Icon2c Version " VERSION " (compiled " __DATE__ ", " __TIME__ ")\n"
  106.        "(c)Copyright 1994,95 by Tobias Ferber, ukjg@rz.uni-karlsruhe.de\n");
  107.  
  108.   puts(license);
  109. }
  110.  
  111.  
  112. #define oops(field,value)  warn("unexpected value 0x%lx for %s",value,field)
  113.  
  114. #define DISKOBJECT_NAME    "icon"
  115. #define GADGETRENDER_NAME  "gr"
  116. #define SELECTRENDER_NAME  "sr"
  117. #define GADGET_NAME        "g"
  118. #define TTARRAY_NAME       "tt"  /* ToolTypes array */
  119. #define DRAWERDATA_NAME    "dd"
  120.  
  121. #define BEGIN_CODE(s)      pout(                                                  \
  122.                              "/*\n *  code generated from \"%s.info\"\n */\n\n"   \
  123.                              "#include <intuition/intuition.h>\n"                 \
  124.                              "#include <workbench/workbench.h>\n"                 \
  125.                              "#include <workbench/icon.h>\n\n"                    \
  126.                            ,s)
  127.  
  128. #define END_CODE           pout(                                                                     \
  129.                              "\n\n#ifdef TEST\n"                                                     \
  130.                              "#include <intuition/intuitionbase.h>\n"                                \
  131.                              "#include <stdlib.h>\n"                                                 \
  132.                              "#include <stdio.h>\n\n"                                                \
  133.                              "extern struct Library *OpenLibrary(STRPTR, ULONG);\n"                  \
  134.                              "extern void CloseLibrary(struct Library *);\n"                         \
  135.                              "extern LONG IoErr(void);\n"                                            \
  136.                              "extern BOOL PrintFault(LONG, STRPTR);\n"                               \
  137.                              "extern BOOL PutDiskObject(char *, struct DiskObject *);\n\n"           \
  138.                              "struct IconBase *IconBase;\n\n"                                        \
  139.                              "int main(int argc, char **argv)\n{\n"                                  \
  140.                              "  if(argc == 2)\n"                                                     \
  141.                              "  {\n"                                                                 \
  142.                              "    if( (IconBase= (struct IconBase *)OpenLibrary(ICONNAME,36)) )\n"   \
  143.                              "    {\n"                                                               \
  144.                              "      if( !PutDiskObject(argv[1],&icon) )\n"                           \
  145.                              "        PrintFault(IoErr(),argv[1]);\n"                                \
  146.                              "      CloseLibrary(IconBase);\n"                                       \
  147.                              "    }\n"                                                               \
  148.                              "    else printf(\"%%s: no %%s.\\n\",*argv,ICONNAME);\n"                \
  149.                              "  }\n"                                                                 \
  150.                              "  else printf(\"usage: %%s <filename>\\n\",*argv);\n\n"                \
  151.                              "  return IoErr();\n"                                                   \
  152.                              "}\n"                                                                   \
  153.                              "#endif /* TEST */\n"                                                   \
  154.                            )
  155.  
  156. #define BEGIN_STRUCT(s,n)  pout("\nstruct %s %s = {\n",s,n)
  157. #define END_STRUCT         pout("};\n")
  158. #define BEGIN_FIELD        pout("\t")
  159. #define P_CONST(s)         pout("%s",s)
  160. #define P_NUMVAL(n)        pout("%ld",n)
  161. #define P_HEXVAL(x)        pout("0x%lx",x)
  162. #define P_STRVAL(s)        if(s) { pout("\""); if(*s) pout("%s",s); pout("\""); } else pout("NULL")
  163. #define END_FIELD(f)       if(f && *f) pout(",\t/* %s */\n",f); else pout(",\n")
  164.  
  165.  
  166. #ifdef DEBUG
  167.  
  168. void p_strN(int n, char *s)
  169. {
  170.   if(s)
  171.   { putchar('\"');
  172.     while(*s && 0<n--) putchar(*s++);
  173.     putchar('\"');
  174.   }
  175.   else pout("NULL");
  176. }
  177.  
  178.  
  179. void p_Gadget(struct Gadget *g, char *name)
  180. {
  181.   pout("\n#ifdef UNDEFINED\n");
  182.  
  183.   BEGIN_STRUCT( ((g->Flags & GFLG_EXTENDED) ? "ExtGadget" : "Gadget"), name);
  184.  
  185.     BEGIN_FIELD;
  186.       P_CONST("NULL");
  187.       if(g->NextGadget)
  188.         pout(" /* 0x%lx */",g->NextGadget);
  189.     END_FIELD("NextGadget");
  190.  
  191.     BEGIN_FIELD;
  192.       P_NUMVAL(g->LeftEdge);
  193.     END_FIELD("LeftEdge");
  194.  
  195.     BEGIN_FIELD;
  196.       P_NUMVAL(g->TopEdge);
  197.     END_FIELD("TopEdge");
  198.  
  199.     BEGIN_FIELD;
  200.       P_NUMVAL(g->Width);
  201.     END_FIELD("Width");
  202.  
  203.     BEGIN_FIELD;
  204.       P_NUMVAL(g->Height);
  205.     END_FIELD("Height");
  206.  
  207.     BEGIN_FIELD;
  208.     {
  209.       UWORD f= g->Flags;
  210.  
  211.       if(f)
  212.       {
  213.         /* <workbench/workbench.h> */
  214.         if(f & GADGBACKFILL)      { P_CONST("GADGBACKFILL");      f &= ~GADGBACKFILL;      if(f) P_CONST("|"); }
  215.         /* <intuition/intuition.h> */
  216.         /*if(f & GFLG_GADGHIGHBITS) { P_CONST("GFLG_GADGHIGHBITS"); f &= ~GFLG_GADGHIGHBITS; if(f) P_CONST("|"); }*/
  217.         if(f & GFLG_GADGHCOMP)    { P_CONST("GFLG_GADGHCOMP");    f &= ~GFLG_GADGHCOMP;    if(f) P_CONST("|"); }
  218.         if(f & GFLG_GADGHBOX)     { P_CONST("GFLG_GADGHBOX");     f &= ~GFLG_GADGHBOX;     if(f) P_CONST("|"); }
  219.         if(f & GFLG_GADGHIMAGE)   { P_CONST("GFLG_GADGHIMAGE");   f &= ~GFLG_GADGHIMAGE;   if(f) P_CONST("|"); }
  220.         if(f & GFLG_GADGHNONE)    { P_CONST("GFLG_GADGHNONE");    f &= ~GFLG_GADGHNONE;    if(f) P_CONST("|"); }
  221.         if(f & GFLG_GADGIMAGE)    { P_CONST("GFLG_GADGIMAGE");    f &= ~GFLG_GADGIMAGE;    if(f) P_CONST("|"); }
  222.         if(f & GFLG_RELBOTTOM)    { P_CONST("GFLG_RELBOTTOM");    f &= ~GFLG_RELBOTTOM;    if(f) P_CONST("|"); }
  223.         if(f & GFLG_RELRIGHT)     { P_CONST("GFLG_RELRIGHT");     f &= ~GFLG_RELRIGHT;     if(f) P_CONST("|"); }
  224.         if(f & GFLG_RELWIDTH)     { P_CONST("GFLG_RELWIDTH");     f &= ~GFLG_RELWIDTH;     if(f) P_CONST("|"); }
  225.         if(f & GFLG_RELHEIGHT)    { P_CONST("GFLG_RELHEIGHT");    f &= ~GFLG_RELHEIGHT;    if(f) P_CONST("|"); }
  226.         if(f & GFLG_RELSPECIAL)   { P_CONST("GFLG_RELSPECIAL");   f &= ~GFLG_RELSPECIAL;   if(f) P_CONST("|"); }
  227.         if(f & GFLG_SELECTED)     { P_CONST("GFLG_SELECTED");     f &= ~GFLG_SELECTED;     if(f) P_CONST("|"); }
  228.         if(f & GFLG_DISABLED)     { P_CONST("GFLG_DISABLED");     f &= ~GFLG_DISABLED;     if(f) P_CONST("|"); }
  229.         if(f & GFLG_LABELMASK)    { P_CONST("GFLG_LABELMASK");    f &= ~GFLG_LABELMASK;    if(f) P_CONST("|"); }
  230.         if(f & GFLG_LABELITEXT)   { P_CONST("GFLG_LABELITEXT");   f &= ~GFLG_LABELITEXT;   if(f) P_CONST("|"); }
  231.         if(f & GFLG_LABELSTRING)  { P_CONST("GFLG_LABELSTRING");  f &= ~GFLG_LABELSTRING;  if(f) P_CONST("|"); }
  232.         if(f & GFLG_LABELIMAGE)   { P_CONST("GFLG_LABELIMAGE");   f &= ~GFLG_LABELIMAGE;   if(f) P_CONST("|"); }
  233.         if(f & GFLG_TABCYCLE)     { P_CONST("GFLG_TABCYCLE");     f &= ~GFLG_TABCYCLE;     if(f) P_CONST("|"); }
  234.         if(f & GFLG_STRINGEXTEND) { P_CONST("GFLG_STRINGEXTEND"); f &= ~GFLG_STRINGEXTEND; if(f) P_CONST("|"); }
  235.         if(f & GFLG_IMAGEDISABLE) { P_CONST("GFLG_IMAGEDISABLE"); f &= ~GFLG_IMAGEDISABLE; if(f) P_CONST("|"); }
  236.         if(f & GFLG_EXTENDED)     { P_CONST("GFLG_EXTENDED");     f &= ~GFLG_EXTENDED;     if(f) P_CONST("|"); }
  237.         if(f) P_NUMVAL(f);
  238.       }
  239.       else P_CONST("NULL");
  240.     }
  241.     END_FIELD("Flags");
  242.  
  243.     BEGIN_FIELD;
  244.     {
  245.       UWORD a= g->Activation;
  246.  
  247.       if(a)
  248.       {
  249.         if(a & GFLG_LABELITEXT)   { P_CONST("GFLG_LABELITEXT");   a &= ~GFLG_LABELITEXT;   if(a) P_CONST("|"); }
  250.         if(a & GACT_RELVERIFY)    { P_CONST("GACT_RELVERIFY");    a &= ~GACT_RELVERIFY;    if(a) P_CONST("|"); }
  251.         if(a & GACT_IMMEDIATE)    { P_CONST("GACT_IMMEDIATE");    a &= ~GACT_IMMEDIATE;    if(a) P_CONST("|"); }
  252.         if(a & GACT_ENDGADGET)    { P_CONST("GACT_ENDGADGET");    a &= ~GACT_ENDGADGET;    if(a) P_CONST("|"); }
  253.         if(a & GACT_FOLLOWMOUSE)  { P_CONST("GACT_FOLLOWMOUSE");  a &= ~GACT_FOLLOWMOUSE;  if(a) P_CONST("|"); }
  254.         if(a & GACT_RIGHTBORDER)  { P_CONST("GACT_RIGHTBORDER");  a &= ~GACT_RIGHTBORDER;  if(a) P_CONST("|"); }
  255.         if(a & GACT_LEFTBORDER)   { P_CONST("GACT_LEFTBORDER");   a &= ~GACT_LEFTBORDER;   if(a) P_CONST("|"); }
  256.         if(a & GACT_TOPBORDER)    { P_CONST("GACT_TOPBORDER");    a &= ~GACT_TOPBORDER;    if(a) P_CONST("|"); }
  257.         if(a & GACT_BOTTOMBORDER) { P_CONST("GACT_BOTTOMBORDER"); a &= ~GACT_BOTTOMBORDER; if(a) P_CONST("|"); }
  258.         if(a & GACT_BORDERSNIFF)  { P_CONST("GACT_BORDERSNIFF");  a &= ~GACT_BORDERSNIFF;  if(a) P_CONST("|"); }
  259.         if(a & GACT_TOGGLESELECT) { P_CONST("GACT_TOGGLESELECT"); a &= ~GACT_TOGGLESELECT; if(a) P_CONST("|"); }
  260.         if(a & GACT_BOOLEXTEND)   { P_CONST("GACT_BOOLEXTEND");   a &= ~GACT_BOOLEXTEND;   if(a) P_CONST("|"); }
  261.         if(a & GACT_STRINGLEFT)   { P_CONST("GACT_STRINGLEFT");   a &= ~GACT_STRINGLEFT;   if(a) P_CONST("|"); }
  262.         if(a & GACT_STRINGCENTER) { P_CONST("GACT_STRINGCENTER"); a &= ~GACT_STRINGCENTER; if(a) P_CONST("|"); }
  263.         if(a & GACT_STRINGRIGHT)  { P_CONST("GACT_STRINGRIGHT");  a &= ~GACT_STRINGRIGHT;  if(a) P_CONST("|"); }
  264.         if(a & GACT_LONGINT)      { P_CONST("GACT_LONGINT");      a &= ~GACT_LONGINT;      if(a) P_CONST("|"); }
  265.         if(a & GACT_ALTKEYMAP)    { P_CONST("GACT_ALTKEYMAP");    a &= ~GACT_ALTKEYMAP;    if(a) P_CONST("|"); }
  266.         if(a & GACT_STRINGEXTEND) { P_CONST("GACT_STRINGEXTEND"); a &= ~GACT_STRINGEXTEND; if(a) P_CONST("|"); }
  267.         if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  268.         if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  269.         if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  270.         if(a) P_NUMVAL(a);
  271.       }
  272.       else P_CONST("NULL");
  273.     }
  274.     END_FIELD("Activation");
  275.  
  276.     BEGIN_FIELD;
  277.     {
  278.       UWORD t= g->GadgetType;
  279.  
  280.       if(t)
  281.       {
  282.         if(t & GTYP_GADGETTYPE)   { P_CONST("GTYP_GADGETTYPE");   t &= ~GTYP_GADGETTYPE;   if(t) P_CONST("|"); }
  283.         if(t & GTYP_SYSGADGET)    { P_CONST("GTYP_SYSGADGET");    t &= ~GTYP_SYSGADGET;    if(t) P_CONST("|"); }
  284.         if(t & GTYP_SCRGADGET)    { P_CONST("GTYP_SCRGADGET");    t &= ~GTYP_SCRGADGET;    if(t) P_CONST("|"); }
  285.         if(t & GTYP_GZZGADGET)    { P_CONST("GTYP_GZZGADGET");    t &= ~GTYP_GZZGADGET;    if(t) P_CONST("|"); }
  286.         if(t & GTYP_REQGADGET)    { P_CONST("GTYP_REQGADGET");    t &= ~GTYP_REQGADGET;    if(t) P_CONST("|"); }
  287.         if(t & GTYP_SIZING)       { P_CONST("GTYP_SIZING");       t &= ~GTYP_SIZING;       if(t) P_CONST("|"); }
  288.         if(t & GTYP_WDRAGGING)    { P_CONST("GTYP_WDRAGGING");    t &= ~GTYP_WDRAGGING;    if(t) P_CONST("|"); }
  289.         if(t & GTYP_SDRAGGING)    { P_CONST("GTYP_SDRAGGING");    t &= ~GTYP_SDRAGGING;    if(t) P_CONST("|"); }
  290.         if(t & GTYP_WUPFRONT)     { P_CONST("GTYP_WUPFRONT");     t &= ~GTYP_WUPFRONT;     if(t) P_CONST("|"); }
  291.         if(t & GTYP_SUPFRONT)     { P_CONST("GTYP_SUPFRONT");     t &= ~GTYP_SUPFRONT;     if(t) P_CONST("|"); }
  292.         if(t & GTYP_WDOWNBACK)    { P_CONST("GTYP_WDOWNBACK");    t &= ~GTYP_WDOWNBACK;    if(t) P_CONST("|"); }
  293.         if(t & GTYP_SDOWNBACK)    { P_CONST("GTYP_SDOWNBACK");    t &= ~GTYP_SDOWNBACK;    if(t) P_CONST("|"); }
  294.         if(t & GTYP_CLOSE)        { P_CONST("GTYP_CLOSE");        t &= ~GTYP_CLOSE;        if(t) P_CONST("|"); }
  295.         if(t & GTYP_BOOLGADGET)   { P_CONST("GTYP_BOOLGADGET");   t &= ~GTYP_BOOLGADGET;   if(t) P_CONST("|"); }
  296.         if(t & GTYP_GADGET0002)   { P_CONST("GTYP_GADGET0002");   t &= ~GTYP_GADGET0002;   if(t) P_CONST("|"); }
  297.         if(t & GTYP_PROPGADGET)   { P_CONST("GTYP_PROPGADGET");   t &= ~GTYP_PROPGADGET;   if(t) P_CONST("|"); }
  298.         if(t & GTYP_STRGADGET)    { P_CONST("GTYP_STRGADGET");    t &= ~GTYP_STRGADGET;    if(t) P_CONST("|"); }
  299.         if(t & GTYP_CUSTOMGADGET) { P_CONST("GTYP_CUSTOMGADGET"); t &= ~GTYP_CUSTOMGADGET; if(t) P_CONST("|"); }
  300.         if(t & GTYP_GTYPEMASK)    { P_CONST("GTYP_GTYPEMASK");    t &= ~GTYP_GTYPEMASK;    if(t) P_CONST("|"); }
  301.         if(t) P_NUMVAL(t);
  302.       }
  303.       else P_CONST("NULL");
  304.     }
  305.     END_FIELD("GadgetType");
  306.  
  307.     BEGIN_FIELD;
  308.       if(g->GadgetRender)
  309.         P_CONST("(APTR)&" GADGETRENDER_NAME);
  310.       else
  311.         P_CONST("NULL");
  312.     END_FIELD("GadgetRender");
  313.  
  314.     BEGIN_FIELD;
  315.       if(g->SelectRender)
  316.         P_CONST("(APTR)&" SELECTRENDER_NAME);
  317.       else
  318.         P_CONST("NULL");
  319.     END_FIELD("SelectRender");
  320.  
  321.     BEGIN_FIELD;
  322.       P_CONST("NULL");
  323.       if(g->GadgetText)
  324.         pout(" /* 0x%lx */",g->GadgetText);
  325.     END_FIELD("GadgetText");
  326.  
  327.     BEGIN_FIELD;
  328.       P_NUMVAL(g->MutualExclude);
  329.     END_FIELD("MutualExclude");
  330.  
  331.     BEGIN_FIELD;
  332.       P_CONST("NULL");
  333.       if(g->SpecialInfo)
  334.         pout(" /* 0x%lx */",g->SpecialInfo);
  335.     END_FIELD("SpecialInfo");
  336.  
  337.     BEGIN_FIELD;
  338.       P_NUMVAL(g->GadgetID);
  339.     END_FIELD("GadgetID");
  340.  
  341.     BEGIN_FIELD;
  342.     {
  343.       LONG ud= (LONG)g->UserData;
  344.       LONG dr= ud & WB_DISKREVISIONMASK;
  345.  
  346.       pout("(APTR)");
  347.  
  348.       if(ud != dr)
  349.       {
  350.         P_NUMVAL(ud);
  351.         if(dr) P_CONST("|");
  352.       }
  353.       if(dr == WB_DISKREVISION)
  354.         P_CONST("WB_DISKREVISION");
  355.       else
  356.         P_NUMVAL(dr);
  357.     }
  358.     END_FIELD("UserData");
  359.  
  360.     if(g->Flags & GFLG_EXTENDED)
  361.     {
  362.       struct ExtGadget *eg= (struct ExtGadget *)g;
  363.  
  364.       BEGIN_FIELD;
  365.       {
  366.         ULONG m= eg->MoreFlags;
  367.  
  368.         if(m)
  369.         {
  370.           if(m & GMORE_BOUNDS)       { P_CONST("GMORE_BOUNDS");       m &= ~GMORE_BOUNDS;       if(m) P_CONST("|"); }
  371.           if(m & GMORE_GADGETHELP)   { P_CONST("GMORE_GADGETHELP");   m &= ~GMORE_GADGETHELP;   if(m) P_CONST("|"); }
  372.           if(m & GMORE_SCROLLRASTER) { P_CONST("GMORE_SCROLLRASTER"); m &= ~GMORE_SCROLLRASTER; if(m) P_CONST("|"); }
  373.           if(m) P_NUMVAL(m);
  374.         }
  375.         else P_CONST("NULL");
  376.       }
  377.       END_FIELD("MoreFlags");
  378.  
  379.       BEGIN_FIELD;
  380.         P_NUMVAL(eg->BoundsLeftEdge);
  381.       END_FIELD("BoundsLeftEdge");
  382.  
  383.       BEGIN_FIELD;
  384.         P_NUMVAL(eg->BoundsTopEdge);
  385.       END_FIELD("BoundsTopEdge");
  386.  
  387.       BEGIN_FIELD;
  388.         P_NUMVAL(eg->BoundsWidth);
  389.       END_FIELD("BoundsWidth");
  390.  
  391.       BEGIN_FIELD;
  392.         P_NUMVAL(eg->BoundsHeight);
  393.       END_FIELD("BoundsHeight");
  394.     }
  395.  
  396.   END_STRUCT;
  397.  
  398.   pout("\n#endif /* UNDEFINED */\n");
  399. }
  400.  
  401. #endif /* DEBUG */
  402.  
  403.  
  404. void p_DrawerData(struct DrawerData *dd, char *name)
  405. {
  406.   struct NewWindow *nw= &dd->dd_NewWindow;
  407.  
  408. #ifdef DEBUG
  409.   if(nw->FirstGadget)
  410.     p_Gadget(nw->FirstGadget, "<unknown>");
  411. #endif /* DEBUG */
  412.  
  413.   BEGIN_STRUCT("DrawerData", name);
  414.  
  415.     BEGIN_FIELD;
  416.       P_NUMVAL(nw->LeftEdge);
  417.     END_FIELD("dd_NewWindow.LeftEdge");
  418.  
  419.     BEGIN_FIELD;
  420.       P_NUMVAL(nw->TopEdge);
  421.     END_FIELD("dd_NewWindow.TopEdge");
  422.  
  423.     BEGIN_FIELD;
  424.       P_NUMVAL(nw->Width);
  425.     END_FIELD("dd_NewWindow.Width");
  426.  
  427.     BEGIN_FIELD;
  428.       P_NUMVAL(nw->Height);
  429.     END_FIELD("dd_NewWindow.Height");
  430.  
  431.     BEGIN_FIELD;
  432.       P_NUMVAL(nw->DetailPen);
  433.     END_FIELD("dd_NewWindow.DetailPen");
  434.  
  435.     BEGIN_FIELD;
  436.       P_NUMVAL(nw->BlockPen);
  437.     END_FIELD("dd_NewWindow.BlockPen");
  438.  
  439.     BEGIN_FIELD;
  440.     {
  441.       ULONG f= nw->IDCMPFlags;
  442.  
  443.       if(f)
  444.       {
  445.         if(f & IDCMP_SIZEVERIFY)     { P_CONST("IDCMP_SIZEVERIFY");     f &= ~IDCMP_SIZEVERIFY;     if(f) P_CONST("|"); }
  446.         if(f & IDCMP_NEWSIZE)        { P_CONST("IDCMP_NEWSIZE");        f &= ~IDCMP_NEWSIZE;        if(f) P_CONST("|"); }
  447.         if(f & IDCMP_REFRESHWINDOW)  { P_CONST("IDCMP_REFRESHWINDOW");  f &= ~IDCMP_REFRESHWINDOW;  if(f) P_CONST("|"); }
  448.         if(f & IDCMP_MOUSEBUTTONS)   { P_CONST("IDCMP_MOUSEBUTTONS");   f &= ~IDCMP_MOUSEBUTTONS;   if(f) P_CONST("|"); }
  449.         if(f & IDCMP_MOUSEMOVE)      { P_CONST("IDCMP_MOUSEMOVE");      f &= ~IDCMP_MOUSEMOVE;      if(f) P_CONST("|"); }
  450.         if(f & IDCMP_GADGETDOWN)     { P_CONST("IDCMP_GADGETDOWN");     f &= ~IDCMP_GADGETDOWN;     if(f) P_CONST("|"); }
  451.         if(f & IDCMP_GADGETUP)       { P_CONST("IDCMP_GADGETUP");       f &= ~IDCMP_GADGETUP;       if(f) P_CONST("|"); }
  452.         if(f & IDCMP_REQSET)         { P_CONST("IDCMP_REQSET");         f &= ~IDCMP_REQSET;         if(f) P_CONST("|"); }
  453.         if(f & IDCMP_MENUPICK)       { P_CONST("IDCMP_MENUPICK");       f &= ~IDCMP_MENUPICK;       if(f) P_CONST("|"); }
  454.         if(f & IDCMP_CLOSEWINDOW)    { P_CONST("IDCMP_CLOSEWINDOW");    f &= ~IDCMP_CLOSEWINDOW;    if(f) P_CONST("|"); }
  455.         if(f & IDCMP_RAWKEY)         { P_CONST("IDCMP_RAWKEY");         f &= ~IDCMP_RAWKEY;         if(f) P_CONST("|"); }
  456.         if(f & IDCMP_REQVERIFY)      { P_CONST("IDCMP_REQVERIFY");      f &= ~IDCMP_REQVERIFY;      if(f) P_CONST("|"); }
  457.         if(f & IDCMP_REQCLEAR)       { P_CONST("IDCMP_REQCLEAR");       f &= ~IDCMP_REQCLEAR;       if(f) P_CONST("|"); }
  458.         if(f & IDCMP_MENUVERIFY)     { P_CONST("IDCMP_MENUVERIFY");     f &= ~IDCMP_MENUVERIFY;     if(f) P_CONST("|"); }
  459.         if(f & IDCMP_NEWPREFS)       { P_CONST("IDCMP_NEWPREFS");       f &= ~IDCMP_NEWPREFS;       if(f) P_CONST("|"); }
  460.         if(f & IDCMP_DISKINSERTED)   { P_CONST("IDCMP_DISKINSERTED");   f &= ~IDCMP_DISKINSERTED;   if(f) P_CONST("|"); }
  461.         if(f & IDCMP_DISKREMOVED)    { P_CONST("IDCMP_DISKREMOVED");    f &= ~IDCMP_DISKREMOVED;    if(f) P_CONST("|"); }
  462.         if(f & IDCMP_WBENCHMESSAGE)  { P_CONST("IDCMP_WBENCHMESSAGE");  f &= ~IDCMP_WBENCHMESSAGE;  if(f) P_CONST("|"); }
  463.         if(f & IDCMP_ACTIVEWINDOW)   { P_CONST("IDCMP_ACTIVEWINDOW");   f &= ~IDCMP_ACTIVEWINDOW;   if(f) P_CONST("|"); }
  464.         if(f & IDCMP_INACTIVEWINDOW) { P_CONST("IDCMP_INACTIVEWINDOW"); f &= ~IDCMP_INACTIVEWINDOW; if(f) P_CONST("|"); }
  465.         if(f & IDCMP_DELTAMOVE)      { P_CONST("IDCMP_DELTAMOVE");      f &= ~IDCMP_DELTAMOVE;      if(f) P_CONST("|"); }
  466.         if(f & IDCMP_VANILLAKEY)     { P_CONST("IDCMP_VANILLAKEY");     f &= ~IDCMP_VANILLAKEY;     if(f) P_CONST("|"); }
  467.         if(f & IDCMP_INTUITICKS)     { P_CONST("IDCMP_INTUITICKS");     f &= ~IDCMP_INTUITICKS;     if(f) P_CONST("|"); }
  468.         if(f & IDCMP_IDCMPUPDATE)    { P_CONST("IDCMP_IDCMPUPDATE");    f &= ~IDCMP_IDCMPUPDATE;    if(f) P_CONST("|"); }
  469.         if(f & IDCMP_MENUHELP)       { P_CONST("IDCMP_MENUHELP");       f &= ~IDCMP_MENUHELP;       if(f) P_CONST("|"); }
  470.         if(f & IDCMP_CHANGEWINDOW)   { P_CONST("IDCMP_CHANGEWINDOW");   f &= ~IDCMP_CHANGEWINDOW;   if(f) P_CONST("|"); }
  471.         if(f & IDCMP_GADGETHELP)     { P_CONST("IDCMP_GADGETHELP");     f &= ~IDCMP_GADGETHELP;     if(f) P_CONST("|"); }
  472.         if(f & IDCMP_LONELYMESSAGE)  { P_CONST("IDCMP_LONELYMESSAGE");  f &= ~IDCMP_LONELYMESSAGE;  if(f) P_CONST("|"); }
  473.         if(f) P_NUMVAL(f);
  474.       }
  475.       else P_CONST("NULL");
  476.     }
  477.     END_FIELD("dd_NewWindow.IDCMPFlags");
  478.  
  479.     BEGIN_FIELD;
  480.     {
  481.       ULONG f= nw->Flags;
  482.       if(f)
  483.       {
  484.         if(f & WFLG_SIZEGADGET)     { P_CONST("WFLG_SIZEGADGET");     f &= ~WFLG_SIZEGADGET;     if(f) P_CONST("|"); }
  485.         if(f & WFLG_DRAGBAR)        { P_CONST("WFLG_DRAGBAR");        f &= ~WFLG_DRAGBAR;        if(f) P_CONST("|"); }
  486.         if(f & WFLG_DEPTHGADGET)    { P_CONST("WFLG_DEPTHGADGET");    f &= ~WFLG_DEPTHGADGET;    if(f) P_CONST("|"); }
  487.         if(f & WFLG_CLOSEGADGET)    { P_CONST("WFLG_CLOSEGADGET");    f &= ~WFLG_CLOSEGADGET;    if(f) P_CONST("|"); }
  488.         if(f & WFLG_SIZEBRIGHT)     { P_CONST("WFLG_SIZEBRIGHT");     f &= ~WFLG_SIZEBRIGHT;     if(f) P_CONST("|"); }
  489.         if(f & WFLG_SIZEBBOTTOM)    { P_CONST("WFLG_SIZEBBOTTOM");    f &= ~WFLG_SIZEBBOTTOM;    if(f) P_CONST("|"); }
  490.         /*if(f & WFLG_REFRESHBITS)    { P_CONST("WFLG_REFRESHBITS");    f &= ~WFLG_REFRESHBITS;    if(f) P_CONST("|"); }*/
  491.         if(f & WFLG_SMART_REFRESH)  { P_CONST("WFLG_SMART_REFRESH");  f &= ~WFLG_SMART_REFRESH;  if(f) P_CONST("|"); }
  492.         if(f & WFLG_SIMPLE_REFRESH) { P_CONST("WFLG_SIMPLE_REFRESH"); f &= ~WFLG_SIMPLE_REFRESH; if(f) P_CONST("|"); }
  493.         if(f & WFLG_SUPER_BITMAP)   { P_CONST("WFLG_SUPER_BITMAP");   f &= ~WFLG_SUPER_BITMAP;   if(f) P_CONST("|"); }
  494.         if(f & WFLG_OTHER_REFRESH)  { P_CONST("WFLG_OTHER_REFRESH");  f &= ~WFLG_OTHER_REFRESH;  if(f) P_CONST("|"); }
  495.         if(f & WFLG_BACKDROP)       { P_CONST("WFLG_BACKDROP");       f &= ~WFLG_BACKDROP;       if(f) P_CONST("|"); }
  496.         if(f & WFLG_REPORTMOUSE)    { P_CONST("WFLG_REPORTMOUSE");    f &= ~WFLG_REPORTMOUSE;    if(f) P_CONST("|"); }
  497.         if(f & WFLG_GIMMEZEROZERO)  { P_CONST("WFLG_GIMMEZEROZERO");  f &= ~WFLG_GIMMEZEROZERO;  if(f) P_CONST("|"); }
  498.         if(f & WFLG_BORDERLESS)     { P_CONST("WFLG_BORDERLESS");     f &= ~WFLG_BORDERLESS;     if(f) P_CONST("|"); }
  499.         if(f & WFLG_ACTIVATE)       { P_CONST("WFLG_ACTIVATE");       f &= ~WFLG_ACTIVATE;       if(f) P_CONST("|"); }
  500.         if(f & WFLG_RMBTRAP)        { P_CONST("WFLG_RMBTRAP");        f &= ~WFLG_RMBTRAP;        if(f) P_CONST("|"); }
  501.         if(f & WFLG_NOCAREREFRESH)  { P_CONST("WFLG_NOCAREREFRESH");  f &= ~WFLG_NOCAREREFRESH;  if(f) P_CONST("|"); }
  502.         if(f & WFLG_NW_EXTENDED)    { P_CONST("WFLG_NW_EXTENDED");    f &= ~WFLG_NW_EXTENDED;    if(f) P_CONST("|"); }
  503.         if(f & WFLG_NEWLOOKMENUS)   { P_CONST("WFLG_NEWLOOKMENUS");   f &= ~WFLG_NEWLOOKMENUS;   if(f) P_CONST("|"); }
  504.         if(f & WFLG_WINDOWACTIVE)   { P_CONST("WFLG_WINDOWACTIVE");   f &= ~WFLG_WINDOWACTIVE;   if(f) P_CONST("|"); }
  505.         if(f & WFLG_INREQUEST)      { P_CONST("WFLG_INREQUEST");      f &= ~WFLG_INREQUEST;      if(f) P_CONST("|"); }
  506.         if(f & WFLG_MENUSTATE)      { P_CONST("WFLG_MENUSTATE");      f &= ~WFLG_MENUSTATE;      if(f) P_CONST("|"); }
  507.         if(f & WFLG_WINDOWREFRESH)  { P_CONST("WFLG_WINDOWREFRESH");  f &= ~WFLG_WINDOWREFRESH;  if(f) P_CONST("|"); }
  508.         if(f & WFLG_WBENCHWINDOW)   { P_CONST("WFLG_WBENCHWINDOW");   f &= ~WFLG_WBENCHWINDOW;   if(f) P_CONST("|"); }
  509.         if(f & WFLG_WINDOWTICKED)   { P_CONST("WFLG_WINDOWTICKED");   f &= ~WFLG_WINDOWTICKED;   if(f) P_CONST("|"); }
  510.         if(f & WFLG_VISITOR)        { P_CONST("WFLG_VISITOR");        f &= ~WFLG_VISITOR;        if(f) P_CONST("|"); }
  511.         if(f & WFLG_ZOOMED)         { P_CONST("WFLG_ZOOMED");         f &= ~WFLG_ZOOMED;         if(f) P_CONST("|"); }
  512.         if(f & WFLG_HASZOOM)        { P_CONST("WFLG_HASZOOM");        f &= ~WFLG_HASZOOM;        if(f) P_CONST("|"); }
  513.         if(f) P_NUMVAL(f);
  514.       }
  515.       else P_CONST("NULL");
  516.     }
  517.     END_FIELD("dd_NewWindow.Flags");
  518.  
  519.     BEGIN_FIELD;
  520.       P_CONST("NULL");
  521.       if(nw->FirstGadget)
  522.       {
  523.         pout(" /* 0x%lx */",nw->FirstGadget);
  524.         oops("DrawerData.dd_NewWindow.FirstGadget",nw->FirstGadget);
  525.       }
  526.     END_FIELD("dd_NewWindow.FirstGadget");
  527.  
  528.     BEGIN_FIELD;
  529.       P_CONST("NULL");
  530.       if(nw->CheckMark)
  531.       {
  532.         pout(" /* 0x%lx */",nw->CheckMark);
  533.         oops("DrawerData.dd_NewWindow.CheckMark",nw->CheckMark);
  534.       }
  535.     END_FIELD("dd_NewWindow.CheckMark");
  536.  
  537.     BEGIN_FIELD;
  538.       P_CONST("NULL");
  539.       if(nw->Title)
  540.       {
  541. #ifdef DEBUG
  542.         pout(" /* ");
  543.         p_strN(80,nw->Title);
  544.         pout(" */");
  545. #endif /* DEBUG */
  546.  
  547.         pout(" /* 0x%lx */",nw->Title);
  548.         oops("DrawerData.dd_NewWindow.Title",nw->Title);
  549.       }
  550.     END_FIELD("dd_NewWindow.Title");
  551.  
  552.     BEGIN_FIELD;
  553.       P_CONST("NULL");
  554.       if(nw->Screen)
  555.       {
  556.         pout(" /* 0x%lx */",nw->Screen);
  557.         oops("DrawerData.dd_NewWindow.Screen",nw->Screen);
  558.       }
  559.     END_FIELD("dd_NewWindow.Screen");
  560.  
  561.     BEGIN_FIELD;
  562.       P_CONST("NULL");
  563.       if(nw->BitMap)
  564.       {
  565.         pout(" /* 0x%lx */",nw->BitMap);
  566.         oops("DrawerData.dd_NewWindow.BitMap",nw->BitMap);
  567.       }
  568.     END_FIELD("dd_NewWindow.BitMap");
  569.  
  570.     BEGIN_FIELD;
  571.       P_NUMVAL(nw->MinWidth);
  572.     END_FIELD("dd_NewWindow.MinWidth");
  573.  
  574.     BEGIN_FIELD;
  575.       P_NUMVAL(nw->MinHeight);
  576.     END_FIELD("dd_NewWindow.MinHeight");
  577.  
  578.     BEGIN_FIELD;
  579.       P_NUMVAL(nw->MaxWidth);
  580.     END_FIELD("dd_NewWindow.MaxWidth");
  581.  
  582.     BEGIN_FIELD;
  583.       P_NUMVAL(nw->MinWidth);
  584.     END_FIELD("dd_NewWindow.MaxHeight");
  585.  
  586.     BEGIN_FIELD;
  587.     {
  588.       UWORD t= nw->Type;
  589.  
  590.       if(t)
  591.       {
  592.         if(t & WBENCHSCREEN) { P_CONST("WBENCHSCREEN"); t &= ~WBENCHSCREEN; if(t) P_CONST("|"); }
  593.         if(t & PUBLICSCREEN) { P_CONST("PUBLICSCREEN"); t &= ~PUBLICSCREEN; if(t) P_CONST("|"); }
  594.         if(t & CUSTOMSCREEN) { P_CONST("CUSTOMSCREEN"); t &= ~CUSTOMSCREEN; if(t) P_CONST("|"); }
  595.         if(t & SHOWTITLE)    { P_CONST("SHOWTITLE");    t &= ~SHOWTITLE;    if(t) P_CONST("|"); }
  596.         if(t & BEEPING)      { P_CONST("BEEPING");      t &= ~BEEPING;      if(t) P_CONST("|"); }
  597.         if(t & CUSTOMBITMAP) { P_CONST("CUSTOMBITMAP"); t &= ~CUSTOMBITMAP; if(t) P_CONST("|"); }
  598.         if(t & SCREENBEHIND) { P_CONST("SCREENBEHIND"); t &= ~SCREENBEHIND; if(t) P_CONST("|"); }
  599.         if(t & SCREENQUIET)  { P_CONST("SCREENQUIET");  t &= ~SCREENQUIET;  if(t) P_CONST("|"); }
  600.         if(t & SCREENHIRES)  { P_CONST("SCREENHIRES");  t &= ~SCREENHIRES;  if(t) P_CONST("|"); }
  601.         if(t & NS_EXTENDED)  { P_CONST("NS_EXTENDED");  t &= ~NS_EXTENDED;  if(t) P_CONST("|"); }
  602.         if(t & AUTOSCROLL)   { P_CONST("AUTOSCROLL");   t &= ~AUTOSCROLL;   if(t) P_CONST("|"); }
  603.         if(t & PENSHARED)    { P_CONST("PENSHARED");    t &= ~PENSHARED;    if(t) P_CONST("|"); }
  604.         if(t) P_NUMVAL(t);
  605.       }
  606.       else P_CONST("NULL");
  607.     }
  608.     END_FIELD("dd_NewWindow.Type");
  609.  
  610.     /**/
  611.  
  612.     BEGIN_FIELD;
  613.       if(dd->dd_CurrentX == NO_ICON_POSITION)
  614.         P_CONST("NO_ICON_POSITION");
  615.       else
  616.         P_NUMVAL(dd->dd_CurrentX);
  617.     END_FIELD("dd_CurrentX");
  618.  
  619.     BEGIN_FIELD;
  620.       if(dd->dd_CurrentY == NO_ICON_POSITION)
  621.         P_CONST("NO_ICON_POSITION");
  622.       else
  623.         P_NUMVAL(dd->dd_CurrentY);
  624.     END_FIELD("dd_CurrentY");
  625.  
  626.     BEGIN_FIELD;
  627.       P_NUMVAL(dd->dd_Flags);  /* 1=only icons 2=3=show all */
  628.     END_FIELD("dd_Flags");
  629.  
  630.     BEGIN_FIELD;
  631.       P_NUMVAL(dd->dd_ViewModes); /* 1=by icon, 2=by name, 3=by date, 4=by size */
  632.     END_FIELD("dd_ViewModes");
  633.  
  634.   END_STRUCT;
  635.  
  636. };
  637.  
  638.  
  639. void p_ImageData(struct Image *i, char *name)
  640. {
  641.   WORD w,h,d;
  642.   UWORD *p= i->ImageData;
  643.  
  644.   pout("\nUWORD %s_data[] = {\n",name);
  645.  
  646.   for(d=0; d<i->Depth; d++)
  647.   {
  648.     if(i->PlanePick & (1L << d))
  649.     {
  650.       pout("\n\t/* plane %d */\n\n",d);
  651.  
  652.       for(h=0; h<i->Height; h++)
  653.       {
  654.         pout("\t");
  655.         for(w=0; w< (i->Width + 15)/16; w++)
  656.         {
  657.           pout("0x%04x, ", (UWORD)(*p));
  658.           ++p;
  659.         }
  660.         pout("\n");
  661.       }
  662.     }
  663.     else pout("\n\t/* plane %d is set to %d by %s.PlaneOnOff */\n\n",d,
  664.       ( (i->PlaneOnOff & (1L<<d)) >> d ),name);
  665.   }
  666.   pout("};\n");
  667. }
  668.  
  669.  
  670. void p_Image(struct Image *i, char *name)
  671. {
  672.   if(i->ImageData)
  673.     p_ImageData(i,name);
  674.  
  675.   BEGIN_STRUCT("Image", name);
  676.  
  677.     BEGIN_FIELD;
  678.       P_NUMVAL(i->LeftEdge);
  679.     END_FIELD("LeftEdge");
  680.  
  681.     BEGIN_FIELD;
  682.       P_NUMVAL(i->TopEdge);
  683.     END_FIELD("TopEdge");
  684.  
  685.     BEGIN_FIELD;
  686.       P_NUMVAL(i->Width);
  687.     END_FIELD("Width");
  688.  
  689.     BEGIN_FIELD;
  690.       P_NUMVAL(i->Height);
  691.     END_FIELD("Height");
  692.  
  693.     BEGIN_FIELD;
  694.       P_NUMVAL(i->Depth);
  695.     END_FIELD("Depth");
  696.  
  697.     BEGIN_FIELD;
  698.       if(i->ImageData)
  699.         pout("%s_data",name);
  700.       else
  701.         P_CONST("NULL");
  702.     END_FIELD("ImageData");
  703.  
  704.     BEGIN_FIELD;
  705.       P_NUMVAL(i->PlanePick);
  706.       if( i->PlanePick & ~((1L << i->Depth) -1L) )
  707.       {
  708.         pout(" /* illegal */");
  709.         warn("illegal value %d for Image.PlanePick (depth=%d)",i->PlanePick,i->Depth);
  710.       }
  711.     END_FIELD("PlanePick");
  712.  
  713.     BEGIN_FIELD;
  714.       P_NUMVAL(i->PlaneOnOff);
  715.     END_FIELD("PlaneOnOff");
  716.  
  717.     BEGIN_FIELD;
  718.       P_CONST("NULL");
  719.       if(i->NextImage)
  720.       {
  721.         pout(" /* 0x%lx */", i->NextImage);
  722.         oops("Image.NextImage",i->NextImage);
  723.       }
  724.     END_FIELD("NextImage");
  725.  
  726.   END_STRUCT;
  727. }
  728.  
  729.  
  730. void p_ToolTypes(char **tt, char *name)
  731. {
  732.  
  733.   pout("\nchar *%s[] = %s", name, tt ? "{\n" : "(char **)NULL");
  734.  
  735.   if(tt)
  736.   {
  737.     while(*tt)
  738.     {
  739.       pout("\t\"%s\",\n",*tt++);
  740.     }
  741.     pout("\tNULL\n}");
  742.   }
  743.   pout(";\n");
  744. }
  745.  
  746.  
  747. void p_DiskObject(struct DiskObject *icon, char *name)
  748. {
  749.   BEGIN_STRUCT("DiskObject", name);
  750.  
  751.     BEGIN_FIELD;
  752.       if(icon->do_Magic == WB_DISKMAGIC)
  753.         P_CONST("WB_DISKMAGIC");
  754.       else
  755.         P_NUMVAL(icon->do_Magic);
  756.     END_FIELD("do_Magic");
  757.  
  758.     BEGIN_FIELD;
  759.       if(icon->do_Version == WB_DISKVERSION)
  760.         P_CONST("WB_DISKVERSION");
  761.       else
  762.         P_NUMVAL(WB_DISKVERSION);
  763.     END_FIELD("do_Version");
  764.  
  765.     /* do_Gadget */
  766.     {
  767.       struct Gadget *g= &icon->do_Gadget;
  768.  
  769.       BEGIN_FIELD;
  770.         P_CONST("NULL");
  771.         if(g->NextGadget)
  772.         {
  773.           pout(" /* 0x%lx */",g->NextGadget);
  774.           oops("DiskObject.do_Gadget.NextGadget",g->NextGadget);
  775.         }
  776.       END_FIELD("do_Gadget.NextGadget");
  777.  
  778.       BEGIN_FIELD;
  779.         P_NUMVAL(g->LeftEdge);
  780.       END_FIELD("do_Gadget.LeftEdge");
  781.  
  782.       BEGIN_FIELD;
  783.         P_NUMVAL(g->TopEdge);
  784.       END_FIELD("do_Gadget.TopEdge");
  785.  
  786.       BEGIN_FIELD;
  787.         P_NUMVAL(g->Width);
  788.       END_FIELD("do_Gadget.Width");
  789.  
  790.       BEGIN_FIELD;
  791.         P_NUMVAL(g->Height);
  792.       END_FIELD("do_Gadget.Height");
  793.  
  794.       BEGIN_FIELD;
  795.       {
  796.         UWORD f= g->Flags;
  797.  
  798.         if(f)
  799.         {
  800.           /* <workbench/workbench.h> */
  801.           if(f & GADGBACKFILL)      { P_CONST("GADGBACKFILL");      f &= ~GADGBACKFILL;      if(f) P_CONST("|"); }
  802.           /* <intuition/intuition.h> */
  803.           /*if(f & GFLG_GADGHIGHBITS) { P_CONST("GFLG_GADGHIGHBITS"); f &= ~GFLG_GADGHIGHBITS; if(f) P_CONST("|"); }*/
  804.           if(f & GFLG_GADGHCOMP)    { P_CONST("GFLG_GADGHCOMP");    f &= ~GFLG_GADGHCOMP;    if(f) P_CONST("|"); }
  805.           if(f & GFLG_GADGHBOX)     { P_CONST("GFLG_GADGHBOX");     f &= ~GFLG_GADGHBOX;     if(f) P_CONST("|"); }
  806.           if(f & GFLG_GADGHIMAGE)   { P_CONST("GFLG_GADGHIMAGE");   f &= ~GFLG_GADGHIMAGE;   if(f) P_CONST("|"); }
  807.           if(f & GFLG_GADGHNONE)    { P_CONST("GFLG_GADGHNONE");    f &= ~GFLG_GADGHNONE;    if(f) P_CONST("|"); }
  808.           if(f & GFLG_GADGIMAGE)    { P_CONST("GFLG_GADGIMAGE");    f &= ~GFLG_GADGIMAGE;    if(f) P_CONST("|"); }
  809.           if(f & GFLG_RELBOTTOM)    { P_CONST("GFLG_RELBOTTOM");    f &= ~GFLG_RELBOTTOM;    if(f) P_CONST("|"); }
  810.           if(f & GFLG_RELRIGHT)     { P_CONST("GFLG_RELRIGHT");     f &= ~GFLG_RELRIGHT;     if(f) P_CONST("|"); }
  811.           if(f & GFLG_RELWIDTH)     { P_CONST("GFLG_RELWIDTH");     f &= ~GFLG_RELWIDTH;     if(f) P_CONST("|"); }
  812.           if(f & GFLG_RELHEIGHT)    { P_CONST("GFLG_RELHEIGHT");    f &= ~GFLG_RELHEIGHT;    if(f) P_CONST("|"); }
  813.           if(f & GFLG_RELSPECIAL)   { P_CONST("GFLG_RELSPECIAL");   f &= ~GFLG_RELSPECIAL;   if(f) P_CONST("|"); }
  814.           if(f & GFLG_SELECTED)     { P_CONST("GFLG_SELECTED");     f &= ~GFLG_SELECTED;     if(f) P_CONST("|"); }
  815.           if(f & GFLG_DISABLED)     { P_CONST("GFLG_DISABLED");     f &= ~GFLG_DISABLED;     if(f) P_CONST("|"); }
  816.           if(f & GFLG_LABELMASK)    { P_CONST("GFLG_LABELMASK");    f &= ~GFLG_LABELMASK;    if(f) P_CONST("|"); }
  817.           if(f & GFLG_LABELITEXT)   { P_CONST("GFLG_LABELITEXT");   f &= ~GFLG_LABELITEXT;   if(f) P_CONST("|"); }
  818.           if(f & GFLG_LABELSTRING)  { P_CONST("GFLG_LABELSTRING");  f &= ~GFLG_LABELSTRING;  if(f) P_CONST("|"); }
  819.           if(f & GFLG_LABELIMAGE)   { P_CONST("GFLG_LABELIMAGE");   f &= ~GFLG_LABELIMAGE;   if(f) P_CONST("|"); }
  820.           if(f & GFLG_TABCYCLE)     { P_CONST("GFLG_TABCYCLE");     f &= ~GFLG_TABCYCLE;     if(f) P_CONST("|"); }
  821.           if(f & GFLG_STRINGEXTEND) { P_CONST("GFLG_STRINGEXTEND"); f &= ~GFLG_STRINGEXTEND; if(f) P_CONST("|"); }
  822.           if(f & GFLG_IMAGEDISABLE) { P_CONST("GFLG_IMAGEDISABLE"); f &= ~GFLG_IMAGEDISABLE; if(f) P_CONST("|"); }
  823.           if(f & GFLG_EXTENDED)     { P_CONST("GFLG_EXTENDED");     f &= ~GFLG_EXTENDED;     if(f) P_CONST("|"); }
  824.           if(f) P_NUMVAL(f);
  825.         }
  826.         else P_CONST("NULL");
  827.       }
  828.       END_FIELD("do_Gadget.Flags");
  829.  
  830.       BEGIN_FIELD;
  831.       {
  832.         UWORD a= g->Activation;
  833.  
  834.         if(a)
  835.         {
  836.           if(a & GFLG_LABELITEXT)   { P_CONST("GFLG_LABELITEXT");   a &= ~GFLG_LABELITEXT;   if(a) P_CONST("|"); }
  837.           if(a & GACT_RELVERIFY)    { P_CONST("GACT_RELVERIFY");    a &= ~GACT_RELVERIFY;    if(a) P_CONST("|"); }
  838.           if(a & GACT_IMMEDIATE)    { P_CONST("GACT_IMMEDIATE");    a &= ~GACT_IMMEDIATE;    if(a) P_CONST("|"); }
  839.           if(a & GACT_ENDGADGET)    { P_CONST("GACT_ENDGADGET");    a &= ~GACT_ENDGADGET;    if(a) P_CONST("|"); }
  840.           if(a & GACT_FOLLOWMOUSE)  { P_CONST("GACT_FOLLOWMOUSE");  a &= ~GACT_FOLLOWMOUSE;  if(a) P_CONST("|"); }
  841.           if(a & GACT_RIGHTBORDER)  { P_CONST("GACT_RIGHTBORDER");  a &= ~GACT_RIGHTBORDER;  if(a) P_CONST("|"); }
  842.           if(a & GACT_LEFTBORDER)   { P_CONST("GACT_LEFTBORDER");   a &= ~GACT_LEFTBORDER;   if(a) P_CONST("|"); }
  843.           if(a & GACT_TOPBORDER)    { P_CONST("GACT_TOPBORDER");    a &= ~GACT_TOPBORDER;    if(a) P_CONST("|"); }
  844.           if(a & GACT_BOTTOMBORDER) { P_CONST("GACT_BOTTOMBORDER"); a &= ~GACT_BOTTOMBORDER; if(a) P_CONST("|"); }
  845.           if(a & GACT_BORDERSNIFF)  { P_CONST("GACT_BORDERSNIFF");  a &= ~GACT_BORDERSNIFF;  if(a) P_CONST("|"); }
  846.           if(a & GACT_TOGGLESELECT) { P_CONST("GACT_TOGGLESELECT"); a &= ~GACT_TOGGLESELECT; if(a) P_CONST("|"); }
  847.           if(a & GACT_BOOLEXTEND)   { P_CONST("GACT_BOOLEXTEND");   a &= ~GACT_BOOLEXTEND;   if(a) P_CONST("|"); }
  848.           if(a & GACT_STRINGLEFT)   { P_CONST("GACT_STRINGLEFT");   a &= ~GACT_STRINGLEFT;   if(a) P_CONST("|"); }
  849.           if(a & GACT_STRINGCENTER) { P_CONST("GACT_STRINGCENTER"); a &= ~GACT_STRINGCENTER; if(a) P_CONST("|"); }
  850.           if(a & GACT_STRINGRIGHT)  { P_CONST("GACT_STRINGRIGHT");  a &= ~GACT_STRINGRIGHT;  if(a) P_CONST("|"); }
  851.           if(a & GACT_LONGINT)      { P_CONST("GACT_LONGINT");      a &= ~GACT_LONGINT;      if(a) P_CONST("|"); }
  852.           if(a & GACT_ALTKEYMAP)    { P_CONST("GACT_ALTKEYMAP");    a &= ~GACT_ALTKEYMAP;    if(a) P_CONST("|"); }
  853.           if(a & GACT_STRINGEXTEND) { P_CONST("GACT_STRINGEXTEND"); a &= ~GACT_STRINGEXTEND; if(a) P_CONST("|"); }
  854.           if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  855.           if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  856.           if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  857.           if(a) P_NUMVAL(a);
  858.         }
  859.         else P_CONST("NULL");
  860.       }
  861.       END_FIELD("do_Gadget.Activation");
  862.  
  863.       BEGIN_FIELD;
  864.       {
  865.         UWORD t= g->GadgetType;
  866.  
  867.         if(t)
  868.         {
  869.           if(t & GTYP_GADGETTYPE)   { P_CONST("GTYP_GADGETTYPE");   t &= ~GTYP_GADGETTYPE;   if(t) P_CONST("|"); }
  870.           if(t & GTYP_SYSGADGET)    { P_CONST("GTYP_SYSGADGET");    t &= ~GTYP_SYSGADGET;    if(t) P_CONST("|"); }
  871.           if(t & GTYP_SCRGADGET)    { P_CONST("GTYP_SCRGADGET");    t &= ~GTYP_SCRGADGET;    if(t) P_CONST("|"); }
  872.           if(t & GTYP_GZZGADGET)    { P_CONST("GTYP_GZZGADGET");    t &= ~GTYP_GZZGADGET;    if(t) P_CONST("|"); }
  873.           if(t & GTYP_REQGADGET)    { P_CONST("GTYP_REQGADGET");    t &= ~GTYP_REQGADGET;    if(t) P_CONST("|"); }
  874.           if(t & GTYP_SIZING)       { P_CONST("GTYP_SIZING");       t &= ~GTYP_SIZING;       if(t) P_CONST("|"); }
  875.           if(t & GTYP_WDRAGGING)    { P_CONST("GTYP_WDRAGGING");    t &= ~GTYP_WDRAGGING;    if(t) P_CONST("|"); }
  876.           if(t & GTYP_SDRAGGING)    { P_CONST("GTYP_SDRAGGING");    t &= ~GTYP_SDRAGGING;    if(t) P_CONST("|"); }
  877.           if(t & GTYP_WUPFRONT)     { P_CONST("GTYP_WUPFRONT");     t &= ~GTYP_WUPFRONT;     if(t) P_CONST("|"); }
  878.           if(t & GTYP_SUPFRONT)     { P_CONST("GTYP_SUPFRONT");     t &= ~GTYP_SUPFRONT;     if(t) P_CONST("|"); }
  879.           if(t & GTYP_WDOWNBACK)    { P_CONST("GTYP_WDOWNBACK");    t &= ~GTYP_WDOWNBACK;    if(t) P_CONST("|"); }
  880.           if(t & GTYP_SDOWNBACK)    { P_CONST("GTYP_SDOWNBACK");    t &= ~GTYP_SDOWNBACK;    if(t) P_CONST("|"); }
  881.           if(t & GTYP_CLOSE)        { P_CONST("GTYP_CLOSE");        t &= ~GTYP_CLOSE;        if(t) P_CONST("|"); }
  882.           if(t & GTYP_BOOLGADGET)   { P_CONST("GTYP_BOOLGADGET");   t &= ~GTYP_BOOLGADGET;   if(t) P_CONST("|"); }
  883.           if(t & GTYP_GADGET0002)   { P_CONST("GTYP_GADGET0002");   t &= ~GTYP_GADGET0002;   if(t) P_CONST("|"); }
  884.           if(t & GTYP_PROPGADGET)   { P_CONST("GTYP_PROPGADGET");   t &= ~GTYP_PROPGADGET;   if(t) P_CONST("|"); }
  885.           if(t & GTYP_STRGADGET)    { P_CONST("GTYP_STRGADGET");    t &= ~GTYP_STRGADGET;    if(t) P_CONST("|"); }
  886.           if(t & GTYP_CUSTOMGADGET) { P_CONST("GTYP_CUSTOMGADGET"); t &= ~GTYP_CUSTOMGADGET; if(t) P_CONST("|"); }
  887.           if(t & GTYP_GTYPEMASK)    { P_CONST("GTYP_GTYPEMASK");    t &= ~GTYP_GTYPEMASK;    if(t) P_CONST("|"); }
  888.           if(t) P_NUMVAL(t);
  889.         }
  890.         else P_CONST("NULL");
  891.       }
  892.       END_FIELD("do_Gadget.GadgetType");
  893.  
  894.       BEGIN_FIELD;
  895.         if(g->GadgetRender)
  896.           P_CONST("(APTR)&" GADGETRENDER_NAME);
  897.         else
  898.           P_CONST("NULL");
  899.       END_FIELD("do_Gadget.GadgetRender");
  900.  
  901.       BEGIN_FIELD;
  902.         if(g->SelectRender)
  903.           P_CONST("(APTR)&" SELECTRENDER_NAME);
  904.         else
  905.           P_CONST("NULL");
  906.       END_FIELD("do_Gadget.SelectRender");
  907.  
  908.       BEGIN_FIELD;
  909.         P_CONST("NULL");
  910.         if(g->GadgetText)
  911.         {
  912.           pout(" /* 0x%lx */",g->GadgetText);
  913.           oops("DiskObject.do_Gadget.GadgetText",g->GadgetText);
  914.         }
  915.       END_FIELD("do_Gadget.GadgetText");
  916.  
  917.       BEGIN_FIELD;
  918.         P_NUMVAL(g->MutualExclude);
  919.       END_FIELD("do_Gadget.MutualExclude");
  920.  
  921.       BEGIN_FIELD;
  922.         P_CONST("NULL");
  923.         if(g->SpecialInfo)
  924.         {
  925.           pout(" /* 0x%lx */",g->SpecialInfo);
  926.           oops("DiskObject.do_Gadget.SpecialInfo",g->SpecialInfo);
  927.         }
  928.       END_FIELD("do_Gadget.SpecialInfo");
  929.  
  930.       BEGIN_FIELD;
  931.         P_NUMVAL(g->GadgetID);
  932.       END_FIELD("do_Gadget.GadgetID");
  933.  
  934.       BEGIN_FIELD;
  935.       {
  936.         LONG ud= (LONG)g->UserData;
  937.         LONG dr= ud & WB_DISKREVISIONMASK;
  938.  
  939.         pout("(APTR)");
  940.  
  941.         if(ud != dr)
  942.         {
  943.           P_NUMVAL(ud);
  944.           if(dr) P_CONST("|");
  945.         }
  946.         if(dr == WB_DISKREVISION)
  947.           P_CONST("WB_DISKREVISION");
  948.         else
  949.           P_NUMVAL(dr);
  950.       }
  951.       END_FIELD("do_Gadget.UserData");
  952.     }
  953.  
  954.     BEGIN_FIELD;
  955.       switch(icon->do_Type)
  956.       {
  957.         case WBDISK:     P_CONST("WBDISK");       break;
  958.         case WBDRAWER:   P_CONST("WBDRAWER");     break;
  959.         case WBTOOL:     P_CONST("WBTOOL");       break;
  960.         case WBPROJECT:  P_CONST("WBPROJECT");    break;
  961.         case WBGARBAGE:  P_CONST("WBGARBAGE");    break;
  962.         case WBDEVICE:   P_CONST("WBDEVICE");     break;
  963.         case WBKICK:     P_CONST("WBKICK");       break;
  964.         case WBAPPICON:  P_CONST("WBAPPICON");    break;
  965.         default:         P_NUMVAL(icon->do_Type); break;
  966.       }
  967.     END_FIELD("do_Type");
  968.  
  969.     BEGIN_FIELD;
  970.       P_STRVAL(icon->do_DefaultTool);
  971.     END_FIELD("do_DefaultTool");
  972.  
  973.     BEGIN_FIELD;
  974.       if(icon->do_ToolTypes)
  975.         P_CONST("&" TTARRAY_NAME "[0]");
  976.       else
  977.         P_CONST("NULL");
  978.     END_FIELD("do_ToolTypes");
  979.  
  980.     BEGIN_FIELD;
  981.       if(icon->do_CurrentX == NO_ICON_POSITION)
  982.         P_CONST("NO_ICON_POSITION");
  983.       else
  984.         P_NUMVAL(icon->do_CurrentX);
  985.     END_FIELD("do_CurrentX");
  986.  
  987.     BEGIN_FIELD;
  988.       if(icon->do_CurrentY == NO_ICON_POSITION)
  989.         P_CONST("NO_ICON_POSITION");
  990.       else
  991.         P_NUMVAL(icon->do_CurrentY);
  992.     END_FIELD("do_CurrentY");
  993.  
  994.     BEGIN_FIELD;
  995.       if(icon->do_DrawerData)
  996.         P_CONST("&" DRAWERDATA_NAME);
  997.       else
  998.         P_CONST("NULL");
  999.     END_FIELD("do_DrawerData");
  1000.  
  1001.     BEGIN_FIELD;
  1002.       P_STRVAL(icon->do_ToolWindow);
  1003.     END_FIELD("do_ToolWindow");
  1004.  
  1005.     BEGIN_FIELD;
  1006.       P_NUMVAL(icon->do_StackSize);
  1007.     END_FIELD("do_StackSize");
  1008.  
  1009.   END_STRUCT;
  1010. }
  1011.  
  1012.  
  1013. /*** MAIN ***/
  1014.  
  1015.  
  1016. int main(int argc, char **argv)
  1017. {
  1018.   struct RDArgs *a;
  1019.   LONG args[3] = { 0,0,0 };  /* args array */
  1020.   int rc= RETURN_OK;
  1021.  
  1022.   whoami= *argv;
  1023.   fout= stdout;
  1024.  
  1025.   if( a= ReadArgs("NAME/A,QUIET/S,TO/K", args, NULL) )
  1026.   {
  1027.     if( iname= (char *)malloc(strlen((char *)args[0])+1) )
  1028.     {
  1029.       strcpy(iname, (char *)args[0]); /* now we may use warn() */
  1030.  
  1031.       if( IconBase= (struct IconBase *)OpenLibrary(ICONNAME,36L) )
  1032.       {
  1033.         struct DiskObject *icon= GetDiskObject(iname);
  1034.  
  1035.         if(!icon)
  1036.         {
  1037.           int x= strlen(iname) - 5;
  1038.           if(x>0 && !stricmp(&(iname[x]),".info"))
  1039.           {
  1040.             iname[x]= '\0';
  1041.             icon= GetDiskObject(iname);
  1042.           }
  1043.         }
  1044.  
  1045.         if(icon)
  1046.         {
  1047.           if(args[2])
  1048.           {
  1049.             fout= fopen((char *)args[2],"w");
  1050.  
  1051.             if(!fout)
  1052.             {
  1053.               PrintFault(rc= IoErr(), (STRPTR)args[2]);
  1054.               fprintf(stderr,"%s: Unable to open output file.\n",whoami);
  1055.             }
  1056.           }
  1057.  
  1058.           if(fout)
  1059.           {
  1060.             quiet= args[1]; /* now warn() might be a no-op */
  1061.  
  1062.             BEGIN_CODE(iname);
  1063.             {
  1064.               struct Gadget *g= &icon->do_Gadget;
  1065.  
  1066.               if(g->Flags & GFLG_GADGIMAGE)
  1067.               {
  1068.                 if(g->GadgetRender)
  1069.                   p_Image(g->GadgetRender, GADGETRENDER_NAME);
  1070.  
  1071.                 if(g->SelectRender)
  1072.                 {
  1073.                   if(g->Flags & GFLG_GADGHIMAGE == 0)
  1074.                     warn("warning: no GFLG_GADGHIMAGE for SelectRender image");
  1075.  
  1076.                   p_Image(g->SelectRender, SELECTRENDER_NAME);
  1077.                 }
  1078.                 else if(g->Flags & GFLG_GADGHIMAGE)
  1079.                   warn("warning: No SelectRender image for GFLG_GADGHIMAGE");
  1080.               }
  1081.               else warn("warning: unset GFLG_GADGIMAGE in DiskObject.do_Gadget.Flags");
  1082.  
  1083.               if(icon->do_ToolTypes)
  1084.                 p_ToolTypes(icon->do_ToolTypes, TTARRAY_NAME);
  1085.  
  1086.               if(icon->do_DrawerData)
  1087.                 p_DrawerData(icon->do_DrawerData, DRAWERDATA_NAME);
  1088.  
  1089.               p_DiskObject(icon, DISKOBJECT_NAME);
  1090.             }
  1091.             END_CODE;
  1092.  
  1093.             if(fout != stdout)
  1094.               fclose(fout);
  1095.           }
  1096.  
  1097.           FreeDiskObject(icon);
  1098.         }
  1099.         else /* !icon */
  1100.         {
  1101.           rc= IoErr();
  1102.           warn("GetDiskObject() failed");
  1103.         }
  1104.         CloseLibrary((struct Library *)IconBase);
  1105.       }
  1106.       else /* !IconBase */
  1107.       {
  1108.         warn("You need %s V36+",ICONNAME);
  1109.         rc= RETURN_ERROR;
  1110.       }
  1111.       free(iname);
  1112.     }
  1113.     else /* !iname -> don't use warn() */
  1114.     {
  1115.       fprintf(stderr,"%s: no memory!\n", argv[0]);
  1116.       rc= ERROR_NO_FREE_STORE;
  1117.     }
  1118.     FreeArgs(a);
  1119.   }
  1120.   else /* !ReadArgs() */
  1121.   {
  1122.     if(argc == 1)
  1123.       display_version_information();
  1124.     else
  1125.       PrintFault(rc= IoErr(),NULL);
  1126.   }
  1127.  
  1128.   return rc;
  1129. }
  1130.